#include "HTMLGenerator.h"


HTMLGenerator::HTMLGenerator(const XML * xslSheet)
{
	this->treeTransformation(xslSheet);
}

bool HTMLGenerator::isApplyTemplate(ElementXML * templ)
{
	//cout<<"je rentre dans isapplytempalte"<<endl;
	vector<NodeXML *> *xslFils = templ->getChildren();
	//cout<<"j'ai tant de fils"<<xslFils->size()<<endl;
	if(xslFils->size()<=0 )
	{
		//cout<<"je récupère les fils"<<endl;
		return ((templ->getNameSpace().compare("xsl")==0) && (templ->getName().compare("apply-templates") ==0));
	}else
	{
		//cout<<"y'a des fils"<<endl;
		for(int i=0; i < xslFils->size(); i++)
		{
			ElementXML* elemXML = dynamic_cast<ElementXML*>(xslFils->at(i));
			//cout<<"y'a encore des fils"<<endl;
			if(elemXML != NULL)
			{
				
				if(isApplyTemplate(elemXML))
				{
					return true;
				}
			}
			//free(elemXML);
		}	
	}
	return false;
}

string HTMLGenerator::treeToHTML(NodeXML * root)
{
	string html ="";
	ElementXML* elemXML = dynamic_cast<ElementXML*>(root);
	if(elemXML != NULL)
	{
		bool tempExists= seekForTemplate(elemXML->getName());

		if(tempExists)
		{
			//cout<<"template trouve"<<endl;
			//cout<<isApplyTemplate(elemXML)<<endl;
			if(isApplyTemplate(elemXML))
			{
				//cout<<"c'est un apply template"<<endl;
				vector<NodeXML *> * xmlFils = elemXML->getChildren();
				if(xmlFils->size()<=0)
				{
					html += elemXML->toString();//Appeler la fonction de Joachim
				}else{
					for(int i=0; i<xmlFils->size();i++)
					{
						treeToHTML(xmlFils->at(i));
					}
				}
			}else
			{
				html += elemXML->toString();//Appeler la fonction de joachim
			}
		}
		}else{

		html += elemXML->toString();
	}else{
		return html;
	}
}

bool HTMLGenerator::seekForTemplate(string name)
{
	NodeXML * xslTemplate = mapXsl.find(name)->second;
	if(xslTemplate == NULL)
	{
		return false;
	}else{
		return true;
	}
	
}

string HTMLGenerator::treeTransformation(const XML * xslSheet)
{
	//On vide la map
	mapXsl.clear();
	//On déclare un iterateur sur la liste des fils de l'element xml sxlsheet
	ElementXML * rootXsl = xslSheet->getRoot();
	vector<NodeXML *> * children = rootXsl->getChildren();
	vector<NodeXML *>::iterator it = children->begin();
	
	//on parcours les fils jusqua trouver un template du style : <xsl:template match="rapport">
	for ( ; it != children->end(); it++)
	{

		ElementXML* elemXSL = dynamic_cast<ElementXML*>((*it));
		//Si on tombbe sur un template
		if(elemXSL != NULL)
		{
			if (elemXSL->getNameSpace() == "xsl" && elemXSL->getName() == "template") 
			{
				//On récupêre la valeur des attribut pout avoir le nom associé au template : dans l'exemple on cherche "rapport"
				vector<AttributeXML *> *  vectAtt = elemXSL->getAttributes();
				//On insere d'abord dans la map le nom associé au template, ici "rapport", puis on insère l'Element NodeXml associé
				mapXsl.insert(pair<string, NodeXML *>((*vectAtt)[0]->getValue(), (*it)));
			}
		}

	}
NodeXML * retour = mapXsl.find("title")->second;
	return retour->toString();
}
